package Vue;

import Controleur.ControlePartie;
import java.awt.Color;
import java.awt.GridLayout;
import java.util.Observable;
import java.util.Observer;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.Border;

/**
 * Classe permettant gérer la vue, elle implémente l'interface Observer qui lui permet d'observer le modèle
 * @author El Meknassi Hamza (10806466) - Migeon Cyril (11007322)
 */
public class DamierVue extends javax.swing.JFrame implements Observer {

    //Tableau de cases
    private JPanel tabCasesVue;

    //Référence sur le controleur
    private ControlePartie controleur;

    /**
     * Constructeur de la classe
     * @param nomJ1 nom du joueur 1
     * @param nomJ2 nom du joueur 2
     * @param controleur
     */
    public DamierVue(String nomJ1, String nomJ2, ControlePartie controleur) {
        initComponents();

        //On initialise la référence sur le controleur
        this.controleur = controleur;

        this.setTitle("Jeu de dames");
        this.setLocationRelativeTo(null);
        
        Border blackline = BorderFactory.createLineBorder(Color.blue,1);

        tabCasesVue = new JPanel (new GridLayout (10,10));

        CaseVue caseTemp;
        //Boucle permettant d'initialiser le damier : définir quelles cases sont (in)actives et mettre les listenners
        for (int y=0; y<10; y++)
        {
            for (int x=0; x<10;x++)
            {
                final int tmp_x = x;
                final int tmp_y = y;
                caseTemp = new CaseVue();
                caseTemp.setBorder(blackline);
                //Si la case est active, on lui attribue un listenner
                if (controleur.getEtatCase(x, y)==1 || controleur.getEtatCase(x, y)==0)
                {
                    caseTemp.addMouseListener(new java.awt.event.MouseAdapter() {
                        public void mouseClicked(java.awt.event.MouseEvent evt) {
                            gererClic(tmp_x,tmp_y);
                        }
                    });
                }

                //On active une case sur deux
                if ((x+y) %2 == 0)
                    caseTemp.setEstActive(false);
                else
                    caseTemp.setEstActive(true);

                //On ajoute notre case au tableau de cases
                tabCasesVue.add(caseTemp);
            }
        }
        //On ajoute nos cases à la frame
        this.add(tabCasesVue);

        //Bandeau du bas permettant de savoir à quel joueur est le tour
        this.nomJ1Label.setText(nomJ1);
        this.nomJ2Label.setText(nomJ2);
        this.nomJ1Label.setEnabled(true);
        this.nomJ2Label.setEnabled(false);

        //Images pour savoir les couleurs de chaque joueur
        CaseVue apercuPionJ1 = new CaseVue();
        CaseVue apercuPionJ2 = new CaseVue();
        apercuPionJ1.setBorder(blackline);
        apercuPionJ1.setJoueur(2);
        apercuPionJ1.setEstActive(true);
        apercuPionJ1.setBounds(20, 05, 35, 35);
        apercuPionJ2.setBorder(blackline);
        apercuPionJ2.setJoueur(1);
        apercuPionJ2.setEstActive(true);
        apercuPionJ2.setBounds(0, 05, 35, 35);
        apercuPionJ2.repaint();
        this.panelJ1.add(apercuPionJ1);
        this.panelJ2.add(apercuPionJ2);

        //taille de la fenêtre et du plateau
        tabCasesVue.setSize(500, 500);
        tabCasesVue.setVisible(true);
        this.setVisible(true);
        this.setSize(506, this.getHeight()+30);

    }

    /**
     * Permet d'informer le controleur qu'un clic a eu lieu aux coordonnées envoyées
     * @param x
     * @param y
     */
    public void gererClic (int x, int y)
    {
        controleur.gererClic(x, y);
    }
    

    /**
    * Fonction permettant de colorier les cases (colorier les pions etc ...)
    */
    public void colorierCases()
    {
        int id = 0;
        for (int y=0; y<10; y++)
        {
            for (int x=0; x< 10; x++)
            {
                if (controleur.getEtatCase(x, y)==1)
                {
                    if (controleur.getCouleurCase(x, y) == 'n')
                        ((CaseVue) tabCasesVue.getComponent(id)).setJoueur(1);
                    else
                        ((CaseVue) tabCasesVue.getComponent(id)).setJoueur(2);
                    if (controleur.isDame(x, y))
                        ((CaseVue) tabCasesVue.getComponent(id)).setDame(true);
                    else
                        ((CaseVue) tabCasesVue.getComponent(id)).setDame(false);
                }
                else if (controleur.getEtatCase(x, y)==0)
                    ((CaseVue) tabCasesVue.getComponent(id)).setJoueur(0);
              
                ((CaseVue) tabCasesVue.getComponent(id)).repaint();
                id++;
            }
        }
    }

    /**
     * Colorie les cases qui peuvent effectuer une prise (celle ayant le plus grand nombre de prises)
     * @param id
     */
    public void casesProposees(int id[])
    {
        for (int i=0; i<id.length; i++)
        {
            ((CaseVue) tabCasesVue.getComponent(id[i])).setPropose(true);
            ((CaseVue) tabCasesVue.getComponent(id[i])).repaint();
        }
    }

    /**
     * Met l'attribut propose de toutes les cases à faux (aucune case n'est proposée)
     */
    public void viderCasesProposees()
    {
        int id = 0;
        for (int y=0; y<10; y++)
        {
            for (int x=0; x< 10; x++)
            {
                ((CaseVue) tabCasesVue.getComponent(id)).setPropose(false);
                ((CaseVue) tabCasesVue.getComponent(id)).repaint();
                id++;
            }
        }
    }

    /**
     * Permet de mettre un fond jaune à la case donnée en paramètre pour mettre en avant le fait qu'elle est sélectionnée
     * @param id
     */
    public void selectionnerCase(int id)
    {
        ((CaseVue) tabCasesVue.getComponent(id)).setSelection(true);
        ((CaseVue) tabCasesVue.getComponent(id)).repaint();
    }

    /**
     * Permet d'enlever le fond jaune de la case (elle était déjà sélectionnée)
     * @param id
     */
    public void deselectionnerCase(int id)
    {
        ((CaseVue) tabCasesVue.getComponent(id)).setSelection(false);
        ((CaseVue) tabCasesVue.getComponent(id)).repaint();
    }

    /**
     * Active ou désactive le panneau du joueur, permet d'identifier à qui est le tour de manière visuelle
     * @param numJoueur
     */
    public void panneauActif(int numJoueur)
    {
        if (numJoueur == 1)
        {
            ((JLabel)this.panelJ1.getComponent(0)).setEnabled(true);
            ((JLabel)this.panelJ1.getComponent(0)).setForeground(Color.blue);
            ((JLabel)this.panelJ2.getComponent(0)).setEnabled(false);
        }
        else if(numJoueur == 2)
        {
            ((JLabel)this.panelJ1.getComponent(0)).setEnabled(false);
            ((JLabel)this.panelJ2.getComponent(0)).setEnabled(true);
            ((JLabel)this.panelJ2.getComponent(0)).setForeground(Color.blue);
        }
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelJ1 = new javax.swing.JPanel();
        nomJ1Label = new javax.swing.JLabel();
        panelJ2 = new javax.swing.JPanel();
        nomJ2Label = new javax.swing.JLabel();
        barreMenu = new javax.swing.JMenuBar();
        partieLabel = new javax.swing.JMenu();
        nouvellePartieIM = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        quitterIM = new javax.swing.JMenuItem();
        aproposLabel = new javax.swing.JMenu();
        aProposItemMenu = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        nomJ1Label.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        nomJ1Label.setText("Joueur 1");

        javax.swing.GroupLayout panelJ1Layout = new javax.swing.GroupLayout(panelJ1);
        panelJ1.setLayout(panelJ1Layout);
        panelJ1Layout.setHorizontalGroup(
            panelJ1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelJ1Layout.createSequentialGroup()
                .addGap(67, 67, 67)
                .addComponent(nomJ1Label)
                .addContainerGap(74, Short.MAX_VALUE))
        );
        panelJ1Layout.setVerticalGroup(
            panelJ1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelJ1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(nomJ1Label)
                .addContainerGap(27, Short.MAX_VALUE))
        );

        nomJ2Label.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        nomJ2Label.setText("Joueur 2");

        javax.swing.GroupLayout panelJ2Layout = new javax.swing.GroupLayout(panelJ2);
        panelJ2.setLayout(panelJ2Layout);
        panelJ2Layout.setHorizontalGroup(
            panelJ2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelJ2Layout.createSequentialGroup()
                .addGap(47, 47, 47)
                .addComponent(nomJ2Label)
                .addContainerGap(122, Short.MAX_VALUE))
        );
        panelJ2Layout.setVerticalGroup(
            panelJ2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelJ2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(nomJ2Label)
                .addContainerGap(27, Short.MAX_VALUE))
        );

        partieLabel.setText("Partie");

        nouvellePartieIM.setText("Nouvelle partie");
        nouvellePartieIM.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nouvellePartieIMActionPerformed(evt);
            }
        });
        partieLabel.add(nouvellePartieIM);
        partieLabel.add(jSeparator1);

        quitterIM.setText("Quitter");
        quitterIM.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                quitterIMActionPerformed(evt);
            }
        });
        partieLabel.add(quitterIM);

        barreMenu.add(partieLabel);

        aproposLabel.setText("?");

        aProposItemMenu.setText("A propos de");
        aProposItemMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                aProposItemMenuActionPerformed(evt);
            }
        });
        aproposLabel.add(aProposItemMenu);

        barreMenu.add(aproposLabel);

        setJMenuBar(barreMenu);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addComponent(panelJ1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(99, 99, 99)
                .addComponent(panelJ2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(481, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(panelJ2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelJ1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        // TODO add your handling code here:
        int reponse = JOptionPane.showConfirmDialog(this, "Etes-vous sur de vouloir quitter l'application ?", "Quitter", JOptionPane.YES_NO_OPTION);
            if(reponse==JOptionPane.YES_OPTION)
                System.exit(0);
    }//GEN-LAST:event_formWindowClosing

    private void aProposItemMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aProposItemMenuActionPerformed
        // TODO add your handling code here:
        controleur.aPropos();
    }//GEN-LAST:event_aProposItemMenuActionPerformed

    private void nouvellePartieIMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nouvellePartieIMActionPerformed
        // TODO add your handling code here:
        controleur.rejouer();
    }//GEN-LAST:event_nouvellePartieIMActionPerformed

    private void quitterIMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_quitterIMActionPerformed
        // TODO add your handling code here:
        int reponse = JOptionPane.showConfirmDialog(this, "Etes-vous sur de vouloir quitter l'application ?", "Quitter", JOptionPane.YES_NO_OPTION);
            if(reponse==JOptionPane.YES_OPTION)
                System.exit(0);
    }//GEN-LAST:event_quitterIMActionPerformed

   

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem aProposItemMenu;
    private javax.swing.JMenu aproposLabel;
    private javax.swing.JMenuBar barreMenu;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JLabel nomJ1Label;
    private javax.swing.JLabel nomJ2Label;
    private javax.swing.JMenuItem nouvellePartieIM;
    private javax.swing.JPanel panelJ1;
    private javax.swing.JPanel panelJ2;
    private javax.swing.JMenu partieLabel;
    private javax.swing.JMenuItem quitterIM;
    // End of variables declaration//GEN-END:variables

    /**
     * Permet de recevoir les notifications des modifications du modèle, et de spécifier le traitement souhaité
     * @param o
     * @param arg
     */
    public void update(Observable o, Object arg) {
        colorierCases();
    }
}
